package com.yunke.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yunke.entity.YunkeDistributorWithdraw;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 分销提现记录 Mapper 接口
 *
 * @author yunke
 * @since 1.0.0
 */
@Mapper
public interface YunkeDistributorWithdrawMapper extends BaseMapper<YunkeDistributorWithdraw> {

    /**
     * 分页查询提现记录
     *
     * @param page 分页参数
     * @param distributorId 分销商ID
     * @param withdrawStatus 提现状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 提现记录列表
     */
    IPage<YunkeDistributorWithdraw> selectWithdrawPage(
            Page<YunkeDistributorWithdraw> page,
            @Param("distributorId") Long distributorId,
            @Param("withdrawStatus") Integer withdrawStatus,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 统计分销商提现汇总
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 提现汇总
     */
    Map<String, Object> selectWithdrawSummary(
            @Param("distributorId") Long distributorId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 查询待审核提现列表
     *
     * @return 待审核提现列表
     */
    List<YunkeDistributorWithdraw> selectPendingWithdraws();

    /**
     * 查询今日提现金额
     *
     * @param distributorId 分销商ID
     * @return 今日提现金额
     */
    BigDecimal selectTodayWithdrawAmount(@Param("distributorId") Long distributorId);

    /**
     * 查询提现次数统计
     *
     * @param distributorId 分销商ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 提现次数
     */
    Integer countWithdrawTimes(
            @Param("distributorId") Long distributorId,
            @Param("startTime") Long startTime,
            @Param("endTime") Long endTime
    );

    /**
     * 批量更新提现状态
     *
     * @param withdrawIds 提现ID列表
     * @param newStatus 新状态
     * @param auditorId 审核人ID
     * @param auditTime 审核时间
     * @param auditRemark 审核意见
     * @return 更新行数
     */
    int batchUpdateStatus(
            @Param("withdrawIds") List<Long> withdrawIds,
            @Param("newStatus") Integer newStatus,
            @Param("auditorId") Long auditorId,
            @Param("auditTime") Long auditTime,
            @Param("auditRemark") String auditRemark
    );

    /**
     * 查询提现趋势图数据
     *
     * @param distributorId 分销商ID
     * @param days 天数
     * @return 趋势图数据
     */
    List<Map<String, Object>> selectWithdrawTrend(@Param("distributorId") Long distributorId, @Param("days") Integer days);
} 